// 解析token 的中间件
// expressjwt ({ secret:secretKey })
// 用来指定哪些接口不需要访问权限
// .unless({path:[/^\/api\//]})
// algorithms 是 express - jwt 模块中用于指定JWT签名算法的参数。JWT签名算法是用于生成和验证JWT签名的算法类型，通常使用的算法类型有 HS256、HS384、HS512、RS256、RS384、RS512 等。
// 当验证JWT时，需要使用与JWT签名时相同的算法类型进行验证。因此，您需要在使用 express - jwt 模块时指定相应的算法类型。
// 旧版本 是 req.user 可以拿到挂在的用户信息,新版的是 req.auth 使用 unless 指定有/api 的接口 不用校验token 
// app.use(expressjwt({ secret: secretKey, algorithms: ['HS256'] }).unless({ path: [/^\/api\//] }))





const secret = "ceshi ^_^";
const jwt = require("jsonwebtoken");
const { expressjwt } = require('express-jwt');

function getToken(config) {
    let token = jwt.sign(config, secret, {
        algorithm: "HS256",
        expiresIn: 3600 * 12, // 12 hours
    });
    return token.replace(/\n/g, "");
}

function getTokenRule() {
    return expressjwt({
        secret,
        algorithms: ["HS256"],
        getToken(req) {
            if (
                req.headers.authorization &&
                req.headers.authorization.split(" ")[0] === "Bearer"
            ) {
                return req.headers.authorization.split(" ")[1];
            } else if (req.query && req.query.token) {
                return req.query.token;
            }
            return null;
        },
    }).unless({ path: [/^\/api\//] });
}

module.exports = {
    getTokenRule,
    getToken,
};